A computer program is typically written in a high-level language, and this high-level language version of the program is typically referred to as source code. This source code is then transformed into a low-level language, and this low-level language version of the program is typically referred to as object code. The high-level language is typically easier for the program designers and developers to work with, while the low-level language is the language that the processor(s) of the computer running the program understand. This transforming of a higher-level version of the program into a lower-level version of the program is oftentimes referred to as compiling the program. In some situations, the developer compiles the program prior to distribution, so that the end user receives the object code ready to run on his or her computer. In other situations, the developer distributes the program in an intermediate language (IL), which is then compiled at the end user's computer. This compilation at the end user's computer can be performed as the program is run, with functions being compiled as they are needed by the program, which is referred to as just-in-time (JIT) compilation.
Typically, a developer generates a single version of a program, either a compiled object code version or an IL version, and then distributes that same version to all of the end users. This single-version approach is easier on the developer than distributing multiple versions of the program because only a single version need be generated and there is no confusion as to which version an end user has or should have. However, this approach can also be problematic because it does not allow different versions of the program designed to be more useful for different types of end users and/or different uses of the program to be distributed. Thus, it would be beneficial to have a way to maintain much of the ease of distributing a single version of the program, while at the same time allowing programs designed to be more useful for different types of end users and/or different uses of the program to be supported.